﻿//Autor: Sérgio Santos nº 5626

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Windows.Forms;
using System.IO;

namespace estiglp1112_5626_csharp_rec
{
    class Dados
    {
        public int NumeroEstabelecimentoPorAno;

        public List<string> ComboBox_Categoria;

        public List<string> ComboBox_Estabelecimento;

        public int Num_Doc_Cat;

        public int Num_Doc_Estab;

        public List<doc> listDataBase = new List<doc>();

        /**
         * Metodo que cria a base de dados!
         * 
         * */

        public void criar_DB()
        {
            SQLiteConnection conn = new SQLiteConnection("Data Source=db_lp.db");

            conn.Open();

            SQLiteTransaction tran = conn.BeginTransaction();

            SQLiteCommand cmd = conn.CreateCommand();

            cmd.CommandText = "drop table if exists PROF";

            cmd.ExecuteNonQuery();

            cmd.CommandText = "create table if not exists PROF(codigo_do_docente integer," +
                        "nome varchar,ultimo_grau varchar, curso varchar," +
                         "categoria varchar, regime_tempo varchar, ano_lectivo integer," +
                          "tipo_estabelecimento varchar, nome_estabelecimento varchar)";

            cmd.ExecuteNonQuery();

            tran.Commit();

            conn.Close();

        }

        /**
         * Metodo que lê os ficheiros csv e carrega os dados para a Base Dados!
         * */
        public void Carregar_Dados()
        {
            SQLiteConnection conn = new SQLiteConnection("Data Source=db_lp.db");

            conn.Open();

            SQLiteTransaction tran = conn.BeginTransaction();

            SQLiteCommand cmd = conn.CreateCommand();

            FileStream fin;

            String s;

            for (int i = 0; i < 11; i++)
            {
                try
                {
                    fin = new FileStream("reb" + i + ".csv", FileMode.Open);
                }
                catch (FileNotFoundException exc)
                {
                    MessageBox.Show(exc.Message + "Cannot open file.");

                    return;
                }

                StreamReader fstr_in = new StreamReader(fin);

                cmd = conn.CreateCommand();

                cmd.CommandText = "insert into PROF" +
                    " VALUES(?,?,?,?,?,?,?,?,?)";

                for (int x = 0; x < 9; x++)
                {
                    cmd.Parameters.Add(cmd.CreateParameter());
                }

                char[] charArray = new char[] { ',' };

                string[] strArray;

                while ((s = fstr_in.ReadLine()) != null)
                {

                    strArray = s.Split(charArray);

                    try
                    {

                        for (int x = 0; x < 9; x++)
                        {
                            cmd.Parameters[x].Value = strArray[x];
                        }

                        try
                        {
                            cmd.ExecuteNonQuery();

                        }
                        catch (System.Data.SQLite.SQLiteException)
                        {

                        }


                    }
                    catch (System.IndexOutOfRangeException)
                    {

                    }


                }

                fstr_in.Close();
                fin.Close();
            }

            tran.Commit();

            conn.Close();
        }

        /**
         * Metodo que efetua a estatistica Estabelecimentos por Ano!
         * @param ano, ano para efetuar estatisticas.
         * */

        public void Numero_Estabelecimentos_Por_Ano(string ano)
        {

            List<string> EstabelecimentoPorAno = new List<string>();

            var query_cat_estab_ano = (from i in this.listDataBase
                                      where i.ano == ano
                                      select i.nomeEstabeleciemnto).Distinct();
           
            foreach (var value in query_cat_estab_ano)
            {
                    EstabelecimentoPorAno.Add(value.ToString());  
            }

            this.NumeroEstabelecimentoPorAno = EstabelecimentoPorAno.Count();
            
        }

        /**
         * Metodo que efetua a estatistica Numero de Docentes por Categoria !
         * @param cat, categoria para efetuar estatisticas.
         * */

        public void Numero_Docentes_Categoria(string cat)
        {
            this.Num_Doc_Cat = 0;
            
            List<string> DocentePorCategoria = new List<string>();

            var query_cat_estab_ano2 = (from ii in this.listDataBase
                                       where ii.categoria == cat
                                       select ii.cod_doc);

            foreach (var value7 in query_cat_estab_ano2)
            {
                DocentePorCategoria.Add(value7);
            }

            this.Num_Doc_Cat = DocentePorCategoria.Count();

        }

        /**
         * Metodo que efetua a estatistica Numero de Docentes por Estabelecimento !
         * @param estab, nome estabelecimento para efetuar estatisticas.
         * */

        public void Numero_Docentes_Estabelecimento(string estab)
        {
            this.Num_Doc_Estab = 0;

            List<string> DocentePorEstabelecimento = new List<string>();

            var query_cat_estab_ano2 = (from ii in this.listDataBase
                                        where ii.nomeEstabeleciemnto == estab
                                        select ii.cod_doc).Distinct();

            foreach (var value7 in query_cat_estab_ano2)
            {
                DocentePorEstabelecimento.Add(value7);
            }

            this.Num_Doc_Estab = DocentePorEstabelecimento.Count();
        }

        /**
         * Metodo que efetua carregamento das combobox's e é adiconado á this.listDataBase novos parametros 
         * para efetuar as estatisticas.!
         * 
         * */

        public void getDadosComboBoxs()
        {
            SQLiteConnection conn = new SQLiteConnection("Data Source=db_lp.db");

            conn.Open();

            SQLiteCommand cmd = conn.CreateCommand();

            cmd.CommandText = "select codigo_do_docente ,categoria , ano_lectivo " +
                            ", nome_estabelecimento from PROF ";
            cmd.ExecuteNonQuery();

            SQLiteDataReader dataBase_read = cmd.ExecuteReader();

            this.ComboBox_Categoria = new List<string>();

            while (dataBase_read.Read())
            {
                this.listDataBase.Add(
                    new doc
                    {
                        cod_doc = dataBase_read[0].ToString(),
                        categoria = dataBase_read[1].ToString().Replace('"' , ' '),
                        nomeEstabeleciemnto = dataBase_read[3].ToString().Replace('"' , ' ').Replace('%',' ').Replace('6',' ').Replace('9',' '),
                        ano = dataBase_read[2].ToString()
                    });
            }

            dataBase_read.Close();

            var query_grau_estab_ano = (from i in this.listDataBase
                                       select i.categoria).Distinct();
           
            foreach (var value in query_grau_estab_ano)
            {
                this.ComboBox_Categoria.Add(value);
            }

            this.ComboBox_Categoria.Sort();

            this.ComboBox_Estabelecimento = new List<string>();
            
            var query_grau_estab_ano2 = (from i in this.listDataBase
                                       select i.nomeEstabeleciemnto).Distinct();
           
            foreach (var value2 in query_grau_estab_ano2)
            {
                if (value2 == "2000")
                {
                    
                }
                else
                {
                    this.ComboBox_Estabelecimento.Add(value2);
                }
            }

            this.ComboBox_Estabelecimento.Sort();

            conn.Close();
        }

        /**
         * Metodo que retorna list de categorias
         * @return this.ComboBox_Categoria
         * */

        public List<string> getComboBox_Categoria()
        {
            return this.ComboBox_Categoria;
        }

        /**
         * Metodo que retorna list de estabelecimentos
         * @return this.ComboBox_Estabelecimento
         * */

        public List<string> getComboBox_Estabelecimento()
        {
            return this.ComboBox_Estabelecimento;
        }

        /**
         * Metodo que retorna numero de docentes por ano
         * @return this.NumeroEstabelecimentoPorAno
         * */

        public int getNumeroEstabelecimentoPorAno()
        {
            return this.NumeroEstabelecimentoPorAno;
        }

        /**
         * Metodo que retorna numero de docentes por categoria
         * @return this.Num_Doc_Cat
         * */

        public int getNumero_Docentes_Categoria()
        {
            return this.Num_Doc_Cat;
        }

        /**
         * Metodo que retorna numero de docentes por estabelecimento
         * @return this.Num_Doc_Estab
         * */

        public int getNumero_Docentes_Estabelecimento()
        {
            return this.Num_Doc_Estab;
        }
    }
}
